#ifndef __LRUCACHE_H__
#define __LRUCACHE_H__

#include <unordered_map>
#include <nlohmann/json.hpp>
#include <map>
#include <unordered_map>
#include <list>
#include <string>

using namespace std;

using nlohmann::json;

/*
  LRUCache（最近最少使用缓存）
  该类实现了一个基于 LRU (Least Recently Used) 策略的缓存。
  采用 **双向链表 + 哈希表** 结构，提供 O(1) 时间复杂度的查询和更新。
  主要功能包括：
    - 存储键值对，并按 LRU 规则自动管理数据
    - 支持从文件读取/写入缓存数据
    - 允许增量更新，实现数据同步
 */

class LRUCache
{
public:
    // 初始化缓存，默认最大容量 1000
    LRUCache();

    // 析构函数，释放资源
    ~LRUCache();

    // 添加键值对到缓存，若键已存在，则更新值，并移动到最近使用位置
    // 若缓存已满，则移除最久未使用的元素
    void addElement(const string &key, const json &value);

    // 从指定文件加载缓存数据
    void readFromFile(const string &filename);

    // 没有命中时（即数据不在当前缓存中），将查询到的数据存入 _pendingUpdateList，以待数据同步
    void put_insert(const string &key, const json &value);

    // 将整个缓存数据写入文件（快照存储，类似 Redis RDB 持久化）
    void writeToFile(const string &filename);

    // 追加单个键值对到文件（增量存储，类似 Redis AOF 持久化）
    void writeToFile(const string &filename, const string &key, const json &value);

    // 使用另一个 LRUCache 实例更新当前缓存（数据同步）
    void update(const LRUCache &rhs);

    // 通过 key 查询缓存，若存在则返回 true，并将值赋给 j，否则返回 false
    bool getjson(const string &key, json &j);

    // 获取待更新的键值对列表（用于增量同步）
    list<pair<string, json>> &getPendingUpdateList();

    // 获取当前缓存存储的所有键值对（按 LRU 规则排序，最近访问的在前）
    list<pair<string, json>> &getResultList();

private:
    // 哈希表（key -> 双向链表节点的迭代器），支持 O(1) 时间复杂度的查找
    unordered_map<string, list<pair<string, json>>::iterator> _hashMap;

    // 双向链表存储缓存数据，按 LRU 规则管理，最近使用的数据在前
    list<pair<string, json>> _resultList;

    // 存放待更新的数据（增量更新机制），用于缓存同步
    list<pair<string, json>> _pendingUpdateList;

    // 缓存的最大容量，达到上限时会删除最久未使用的项
    int _capacity;

    // 标识缓存是否有更新（可能用于触发持久化或数据同步）
    bool _isUpdate;
};

#endif
